//
//  ViewController.m
//  网络
//
//  Created by hfzhangzhang on 2018/4/10.
//  Copyright © 2018年 hfzhangzhang. All rights reserved.
//

#import "ViewController.h"
#import "Reachability.h"

@interface ViewController ()
@property(nonatomic,strong)Reachability * reachabilityManager;

@property (weak, nonatomic) IBOutlet UIWebView *myWebView;
@end

@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
}




-(void)connectiondemo{
    //1.rul
    NSURL * url = [NSURL URLWithString:@"https://m.baidu.com"];
    //2.建立请求,告诉服务器想要的资源,已经附加信息
    NSURLRequest * request = [NSURLRequest requestWithURL:url];
    //3.建立网络连接,将请求发送给服务器
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
        //        NSLog(@"%@",data);
        //将二进制数据转换为字符串
        NSString * html = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        NSLog(@"%@",html);
        
        
    }];
}

-(void)connectionDemo1{
    //1.url
    NSURL * url = [NSURL URLWithString:@"https://m.baidu.com"];
    //2.request,向服务器提供附加信息,可变的请求
    NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url];
    //告诉服务器一些附加信息
    //User-Agent 就是告诉服务器客户端的类型:iPhone
    //forHTTPHeaderField 所有访问服务器钱,要额外告诉服务器的附加信息,都是通过这个字段来设置的!
    [request setValue:@"iPhone AppleWebKit" forHTTPHeaderField:@"User-Agent"];
    
    
    //3.连接服务器
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
        NSString * html = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
        NSLog(@"%@",html);
        //让webView 显示html
        [self.myWebView loadHTMLString:html baseURL:nil];
    }];
}


-(void)connectionDemo2{
    //0.NSData 方法  在实际开发中,这个方式不会使用!!
    /**
     - 默认超时是 60s ,没有办法修改,不可以修改缓存策略!
     - dataWithContentsOfURL是同步方法
     - 没有错误处理机制!
     */
    
    NSData * data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://192.168.31.180/demo.json"]];
    
    //1.url
    NSURL * url = [NSURL URLWithString:@"http://192.168.31.180/demo.json"];
    
    //2.request
    /**参数
     1.cachePolicy: 缓存策略
     NSURLRequestUseProtocolCachePolicy = 0,        默认缓存策略
     NSURLRequestReload(刷新)Ignoring(忽略)Local(本地)Cache(缓存)Data = 1,
     忽略本地缓存数据,直接加载网络数据.每次都是"最新数据" 应用场景:数据变化频繁:股票\彩票
     
     一下两个选项,专门用于做离线浏览,建议结合 Reachablility 框架联合使用!!
     - 如果用户当前没有网络,就使用本地缓存
     - 如果有网络,就加载数据
     
     NSURLRequestReturnCacheDataElseLoad = 2,       如果有缓存,返回缓存数据,否则加载
     NSURLRequestReturnCacheDataDontLoad = 3,       如果有缓存,返回缓存数据,否则不加载
     
     2.timeoutInterval:超时时长,访问一个服务器,如果在知道的时间范围内服务器没有做出响应,就放弃请求.
     默认超时是 60秒
     一般在企业开发中建议  15~30秒
     -  SDWebImage 默认时长就是 15s
     -  AFNetworking 默认时长是 60s
     */
    
    NSURLRequest * request = [NSURLRequest requestWithURL:url cachePolicy:0 timeoutInterval:15];
    
    //3.异步发送请求
    /**
     sendAsynchronousRequest - 异步发送请求,不会阻塞线程
     参数
     
     1.request    - 索要资源的请求
     2.queue      - 调度任务的队列
     指定调度会掉代码块的队列!!
     - 主队列,回调的代码在主线程上执行
     - 新建队列,就会在其他线程上执行
     
     如何选择?是否更新UI
     * 有些时候,网络访问结束后,会对返回的二进制做后续处理
     - 返回zip包,需要解压!暂时不会更新UI,又耗时
     - 返回小电影,需要解码..哥么就暂时不会跟新UI
     选择的原则: 是否需要对返回数据做耗时操作!如果直接更新UI 就是主队列!否则用新建队列!
     
     3.block(回调) - 在网络请求结束后执行,已经获得了服务器返回的二进制数据
     参数
     3.1 response(NSHTTPURLResponse):服务器的响应(一般只有在做下载的时候才会使用)
     URL                         服务器返回的URL 绝大多数和请求的URL是一致的
     有的时候回不一样,"重定向"
     MIMEType                    二进制数据的文件类型.服务器告诉客户端,用什么软件打开!
     expectedContentLength       下载文件的长度!
     textEncodingName            文本编码名称,大多数都是 UTF 8
     suggestedFilename           服务器建议保存的文件名
     statusCode                  状态码,2XX OK ,3XX 重定向,4XX 服务端错误,5XX 客户端错误
     allHeaderFields             所有响应头的内容
     
     
     
     3.2 data                    数据实体,开发者最关注的
     3.3 connectionError         链接错误,只要是网络开发,就有可能出现错误!在企业开发中,一定要对
     错误做处理!
     注意:有的时候会出现没有错误!同样也没有数据!!
     if (connectionError || data == nil) {
     NSLog(@"你的网络不给力,请稍后再试...");
     }
     */
    [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc]init] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
        if (connectionError || data == nil) {
            NSLog(@"你的网络不给力,请稍后再试...");
        }
       // NSString * json = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
        /*
         参数:options
         NSJSONReadingMutableContainers = (1UL << 0),   容器节点是可变的
         NSJSONReadingMutableLeaves = (1UL << 1),       子节点是可变的
         NSJSONReadingAllowFragments = (1UL << 2)       允许顶级节点不是 NSArray 和 NSDictionary
         */
        
        //JSON 解析三方框架: JSONKit!  SBJson   TouchJSON
        /*
         JSONKit   : 官方说明 jSONKit 比苹果原生的JSON解析要快
         
         */
        NSError * erro = nil;
        NSArray * array = [NSJSONSerialization JSONObjectWithData:data options:0 error:&erro];
        
        NSLog(@"%@======%@",array,[array class]);
        
        //plist，plist 很少用于传输网络数据,只是苹果使用的比较多
        /*
         NSPropertyListImmutable           不可变
         NSPropertyListMutableContainers    容器可变
         NSPropertyListMutableContainersAndLeaves  容器和子节点可变的
         */
//        id  result =   [NSPropertyListSerialization propertyListWithData:data options:kNilOptions format:NULL error:NULL];
//        NSLog(@"%@====%@",result,[result class]);
    }];
    NSLog(@"come here");
}








-(Reachability *)reachabilityManager
{
    if (!_reachabilityManager) {
        //找一个基本不会"挂的"服务器,或者我们的测试服务器
        _reachabilityManager = [Reachability reachabilityWithHostName:@"baidu.com"];
    }
    return _reachabilityManager;
}
-(void)addReachAbility{
    //注册通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(chechStatus:) name:kReachabilityChangedNotification object:nil];
    //启动监听
    [self.reachabilityManager startNotifier];
}
//MARK: 检测联网状态
-(void)chechStatus:(NSNotification *)not{
    NSLog(@"%@",not);
    switch(self.reachabilityManager.currentReachabilityStatus){
        case NotReachable:
            NSLog(@"没有网络");
            break;
        case ReachableViaWiFi:
            NSLog(@"WIFI");
            break;
        case ReachableViaWWAN:
            NSLog(@"流量");
            break;
        default:
            break;
    }
}
-(void)dealloc{
    [self.reachabilityManager stopNotifier];
    //注销通知
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}


@end
